#ifndef DEVICE_H_
#define DEVICE_H_
#include "../../SAMA_Function.h"

enum Device_OutMode
{
	 PulseSin_FB_Res,
	 PulseSeq_FB_Res,
	 LongSig_FB_Res,
	 LongSig_OD_Res,
	 PulseSin_FB_NORes,
	 PulseSeq_FB_NORes,
	 LongSig_FB_NORes,
	 LongSig_OD_NORes,
	 PulseSin_FB,
	 PulseSeq_FB,
	 LongSig_FB,
	 LongSig_OD
};

enum Device_STP
{
	NO_STOP,
	Yes_STOP,
	NO_STOPandSTOP_sta,
	Yes_STOPandSTOP_sta,
	NO_STOPandOD_order,
	YES_STOPandOD_order,
};

enum Device_DefaultMode
{
	Def_AUTO,
	Def_MAN
};

enum Device_AM
{
	Device_AUTO,
	Device_MAN
};

/*模块可调参数结构体*/
typedef struct {
	Device_OutMode Out_Mode;
	int OutSig_SetTime;
	int OutSig_RseTime;
	Device_DefaultMode Def_Mode;
	Device_STP STP;

	//< duan 0627 下面四个变量可以定义为枚举类型
	int MP;									//< 手动优先级
	bool FLB;								//< 故障闭锁定义参数
	int Tout;								//< 跳闸置位定义参数

	int Tover;								//< 设备行程时间
}DEVICE_Par_t;


/*模块运算中间参数结构体定义*/
typedef struct {
	bool Last_OpenOut;						//< 上一时刻开指令输出
	bool Last_CloseOut;						//< 上一时刻关指令输出
	bool Last_StopOut;						//< 上一时刻停指令输出
	bool Last_DeviceFL;						//< 上一时刻设备故障
	bool Last_TripSta;						//< 上一时刻跳闸状态
	bool Last_OPFail;						//< 上一时刻操作失败

	bool Last_AUTOReq;						//< 上一时刻自动请求
	bool Last_OpenOvr;						//< 上一时刻超驰（联锁）开指令
	bool Last_CloseOvr;						//< 上一时刻超驰（联锁）关指令
	bool Last_TripSig;						//< 上一时刻跳闸输入信号
	bool Last_StaFB3;						//< 上一时刻设备处于就地状态
	bool Last_StaFB1;						//< 输出Out1对应的设备运行状态反馈信号
	bool Last_StaFB2;						//< 输出Out2对应的设备运行状态反馈信号

	float OP_Time;
	float Out_Time;
	Device_AM Manual;
	bool Opening;
	bool Closing;
	bool Stopping;

	bool S[3];
	bool R[3];

	bool Last_Run;
	bool Finished;
	bool Counting;
	bool OPting;
	float Counter;
	float Count;

	bool Out_Sta[3];
}DEVICE_Sta_t;


/*模块参数结构体定义*/
struct DEVICE_T
{
	Model_Base_t Base;			//< 模块基本参数结构体
	DEVICE_Par_t Par;			//< 模块可调参数结构体
	DEVICE_Sta_t Sta;			//< 模块运算中间参数结构体
};

extern DEVICE_T* DEVICE_t;

/*函数*/
bool CALCU_SAMA(DEVICE)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);		//< SAMA运算函数
int BC_PARA(DEVICE)(Model_Base_t* arg, void** Data);													//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int BAK_STA(DEVICE)(Model_Base_t* arg, void** Data);													//< 备份SAMA运算中间参数
int ANA_STA(DEVICE)(Model_Base_t* arg, void** Data);													//< 解析备份的SAMA运算中间参数
int CHANGE_PAR(DEVICE)(Model_Base_t* arg, void** Data);												//< 在线修改模块参数函数
void INIT_STAPAR(DEVICE)(Model_Base_t* arg);															//< 初始化模块运算中间参数
void CMD_DEAL(DEVICE)(Model_Base_t* arg, void* Data, const char* CMD);								//< 与模块相关的命令字处理函数


#endif
